package com.llu.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    /**
     * 配置Spring Security的HTTP安全策略.
     *
     * @param http Spring Security的HttpSecurity对象，用于配置Web应用程序的安全性
     * @throws Exception 配置过程中可能抛出的异常
     */
    protected void configure(HttpSecurity http) throws Exception {
        // 配置访问控制，任何请求都需要经过身份验证
        http
                .authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .formLogin().permitAll(); // 允许所有用户使用表单登录
    }

    @Override
    /**
     * 配置认证管理器
     * 这里我们使用内存认证方式，简化开发过程
     *
     * @param auth 认证管理器构建器，用于配置认证方式
     * @throws Exception 配置过程中可能抛出的异常
     */
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 创建一个BCrypt密码加密器，用于加密用户密码
        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();

        // 开始配置内存认证方式，包括用户、密码和角色
        auth
                .inMemoryAuthentication()   // 直接创建一个用户，懒得搞数据库了
                .passwordEncoder(encoder)  // 设置密码编码器，确保密码被加密存储
                .withUser("wsy")            // 创建一个用户名为wsy的用户
                .password(encoder.encode("123456"))  // 设置该用户的密码，加密后存储
                .roles("admin");            // 赋予该用户管理员角色
    }

    @Bean   // 这里需要将AuthenticationManager注册为Bean，在OAuth配置中使用
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

